package yunwo.cn.yzstation.base;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.zhy.autolayout.utils.AutoUtils;

import java.util.ArrayList;
import java.util.List;

public abstract class BasicAdapter<T> extends BaseAdapter {
  
    /**上下文*/  
    protected Context mctx;
      
    /**数据源*/  
    protected List<T> datas;//全量数据
  
    /**布局ID*/  
    protected int layoutId;  
  
    public BasicAdapter(Context mctx) {  
        this.mctx = mctx;  
        //初始化数据集合的引用  
        this.datas=new ArrayList<T>();
        //初始化布局资源的id，通过抽象函数限制使用者必须传递必要参数  
        layoutId=setItemLayout();  
    }  
      
    protected abstract int setItemLayout();  
  
    public Context getContext(){  
        return mctx;  
    }  
  
    public List<T> getDatas(){return datas;}  
  
    public boolean isEmpty(){  
        return datas.isEmpty();  
    }  
  
    @Override  
    public int getCount() {  
            return null != datas && !datas.isEmpty() ? datas.size() : 0;  
    }  
  
    @Override  
    public Object getItem(int position) {  
        return datas.get(position);  
    }  
  
    @Override  
    public long getItemId(int position) {  
        return position;  
    }  
  
    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {
        T t = datas.get(position);  
        if (convertView == null) {  
            convertView = LayoutInflater.from(mctx).inflate(layoutId, null);
        }  
        //在这里我们调用抽象函数bindData，使用时不同的部分就在这个函数中，这是回调思想的使用  
        bindData(convertView, t,position);  
        //防止使用时没有使用get函数获取组件，我们可以加入异常机制  
        if(null==convertView.getTag())throw new NullPointerException("bindData中请调用ViewHolder的get静态方法去实例化组件");
        AutoUtils.autoSize(convertView);
        return convertView;
    }  
  
    /** 
     * 子类实现，自定义组件和数据之间的映射关系(必须用ViewHolder.get静态方法获取) 
     * @param convertView 
     * @param data 
     * @param position 
     */  
    protected abstract void bindData(View convertView, T data,int position);  
  
    public void refreshDataAndNotifyDataSetChanged(List<? extends T> newDatas){  
        if(null==newDatas||newDatas.isEmpty())return;  
        datas.clear();  
        datas.addAll(newDatas);  
        notifyDataSetChanged();  
    }  
      
    public void addDataAndNotifyDataSetChanged(List<? extends T> newDatas){  
        if(null==newDatas||newDatas.isEmpty())return;  
        datas.addAll(newDatas);  
        notifyDataSetChanged();  
    }  
  
    public void addDataAndNotifyDataSetChanged(T newDatas){  
        if(null==newDatas)return;  
        datas.add(newDatas);  
        notifyDataSetChanged();  
    }  
  
    public BasicAdapter clearDatas(){  
        datas.clear();  
        return this;  
    }  
  
    @SuppressWarnings("unchecked")  
    public <V extends View> V get(View convertView, int id) {  

//      Exception.isNull(convertView, "请检查getView中的convertView对象是否初始化");
          
        SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();
        if (viewHolder == null) {  
            viewHolder = new SparseArray<View>();  
            convertView.setTag(viewHolder);  
        }  
        View childView = viewHolder.get(id);  
        if (childView == null) {  
            childView = convertView.findViewById(id);  
            viewHolder.put(id, childView);  
        }  
        return (V) childView;  
    }  
}  